package com.dys.testio04;

import java.io.*;

/**
 * @className: src.main.java.com.dys.testio04.EfficiencyComparison
 * @description: src.main.java.com.dys.testio04
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/15 下午10:15
 */
public class EfficiencyComparison {

    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws IOException {
        new EfficiencyComparison().bufferedInputStreamReadAndWrite();
    }

    /**
     * 一个字节一个字节读取和写入
     *
     * @throws IOException
     */
    public void oneByteReadAndWriteToFile() throws IOException {
        // 1.有一个源文件
        File f1 = new File("E:\\cert (1).png");
        // 2.有一个目标文件
        File f2 = new File("E:\\cert (2).png");
        // 3.有一根输入的管道 怼到 源文件上
        FileInputStream fis = new FileInputStream(f1);
        // 4.有一根输出的管道 怼到 目标文件上
        FileOutputStream fos = new FileOutputStream(f2);
        // 5.开始复制(边读编写)
        long startTime = System.currentTimeMillis();
        int n = fis.read();
        while (n != -1) {
            fos.write(n);
            n = fis.read();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("复制图片完成的时间: " + (endTime - startTime));
        // 关流
        fos.close();
        fis.close();
    }

    /**
     * 利用缓冲数组进行读取和写入
     *
     * @throws IOException
     */
    public void bufferByteArrayReadAndWriteToFile() throws IOException {
        // 1.有一个源文件
        File f1 = new File("E:\\cert (1).png");
        // 2.有一个目标文件
        File f2 = new File("E:\\cert (2).png");
        // 3.有一根管道 怼到 源文件上
        FileInputStream fis = new FileInputStream(f1);
        // 4.有一根管道 怼到 目标文件上
        FileOutputStream fos = new FileOutputStream(f2);
        // 5.开始复制动作（边读编写）
        long startTime = System.currentTimeMillis();
        byte[] buffer = new byte[1024];
        int n = fis.read(buffer);
        while (n != -1) {
            fos.write(buffer, 0, n);
            n = fis.read(buffer);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("复制图片完成的时间: " + (endTime - startTime));
        // 6.关流
        fos.close();
        fis.close();
    }

    public void bufferedInputStreamReadAndWrite() throws IOException {
        // 1.有一个源文件
        File f1 = new File("E:\\cert (1).png");
        // 2.有一个目标文件
        File f2 = new File("E:\\cert (2).png");
        // 3.有一根管 怼到 源文件上
        FileInputStream fis = new FileInputStream(f1);
        // 4.有一根管 怼到 目标文件上
        FileOutputStream fos = new FileOutputStream(f2);
        // 5.有一根管 套在FileInputStream文件上: 功能加强
        BufferedInputStream bis = new BufferedInputStream(fis);
        // 6.有一个管 套在FileOutputStream文件上：功能加强
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 7.开始复制操作
        // 缓冲字节数组
        byte[] buf = new byte[1024];
        long startTime = System.currentTimeMillis();
        int len = bis.read(buf);
        while (len != -1) {
            /* bos.flush(); 底层已经帮我们做了刷新缓冲区的操作，不用我们手动完成：底层调用flushBuffer()*/
            bos.write(buf, 0, len);
            len = bis.read(buf);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("复制图片完成的时间: " + (endTime - startTime));
        // 8.关流: 倒着关
        // 如果处理流包裹着节点流的话，那么其实只要关闭高级流（处理流），那么里面的字节流也会随之被关闭。
        bos.close();
        bis.close();
        fos.close();
        fis.close();
    }
}
